/**
 *
 */
package cc.xwolf.java8.lambda;

import java.util.Arrays;

/**
 * 函数式接口中可以额外定义多个抽象方法，但这些抽象方法签名必须和Object的public方法一样
 * 为什么限定public类型的方法呢？因为接口中定义的方法都是public类型的。 举个例子，下面的接口就不是函数式接口：Object clone();
 * 函数式接口中除了那个抽象方法外还可以包含静态方法。 Java 8中允许接口实现方法， 而不是简单的声明，
 * 这些方法叫做默认方法，使用特殊的关键字default。 因为默认方法不是抽象方法，所以不影响我们判断一个接口是否是函数式接口。 接口可以继承接口。
 * 如果父接口是一个函数接口， 那么子接口也可能是一个函数式接口。 判断标准依据下面的条件：
 * 
 * @author pingxu
 *
 */
@FunctionalInterface
public interface Converter<F, T> {
//	Object clone(); // Object.clone is protected

	static int sum(int[] array) {
		return Arrays.stream(array).reduce((a, b) -> a + b).getAsInt();
	}

	T convert(F from) throws Exception;

	@Override
	boolean equals(Object obj); // same to Object.equals

	@Override
	int hashCode(); // same to Object.hashCode

	default String sayHi() {
		return "hi ";
	}

	@Override
	String toString(); // same to Object.toString
}
